
package matrixMultiplication;

import java.util.Random;

/**
 * Exercise 4.2
 * @author Katrin Baryshnikova
 */
public class MatrixMul {
    
    /**
     * 
     * @param args
     */
    public static void main(String[] args) {
        int nA = 3, mA = 2;
        Integer[][] A = makeMatrix(nA, mA);        
        int nB = mA, mB = 3;
        Integer[][] B = makeMatrix(nB, mB);
        printMatrix(A, "A");        
        printMatrix(B, "B");
        Integer[][] C = mul(A, B);
        printMatrix(C, "C");
        
    }
    /**
     * Перемножает две матрицы
     * @param A первая матрица
     * @param B вторая матрица
     * @return результат умножения A на B
     */
    
    public static Integer[][] mul(Integer[][] A, Integer[][] B) {
        Integer[][] answ = new Integer[A.length][B[0].length];
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; j < B[0].length; j++) {
                answ[i][j] = 0;
                for (int k = 0; k < A[0].length; k++) {
                    answ[i][j] += A[i][k] * B[k][j];
                }
            }
        }
        return answ;
    }
    
    /**
     * Создает матрицу
     * @param n заданное количество строк в создаваемой матрице
     * @param m заданное количество столбцов в создаваемой матрице
     * @return полученную матрицу
     */
    public static Integer[][] makeMatrix(int n, int m) {
        Integer[][] x = new Integer[n][m];
        Random rn = new Random();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                x[i][j] = rn.nextInt(4);
            }
        }
        return x;
    }
    /**
     * Печатает матрицу 
     * @param x матрица для печати
     * @param matrixName строка пояснения
     */
    public static void printMatrix(Integer[][] x, String matrixName) {
        System.out.println("Matrix " + matrixName + ":");
        for (int i = 0; i < x.length; i++) {
            for (int j = 0; j < x[i].length; j++) {
                System.out.print(x[i][j] + " ");
            }
            System.out.println();
        }        
    }
}
